package com.wn.access.controller;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.wn.access.entity.TradeLog;
import com.wn.access.service.ITradeLogService;
import com.wn.common.model.bank.dto.BankCardAddDTO;
import com.wn.common.model.bank.dto.BankCardRequestDto;
import com.wn.common.model.bank.dto.BaseResult;
import com.wn.common.model.bank.dto.SignatureDto;
import com.wn.common.model.borrow.BorrowRecordVo;
import com.wn.common.model.borrow.BorrowSyncRecordVo;
import com.wn.common.result.Result;
import com.wn.common.utils.MQConstant;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**
 * <p>
 * 托管系统交易记录表 前端控制器
 * </p>
 *
 * @author yellow docker
 * @since 2024-09-05
 */
@RestController
@RequestMapping("/trade-log")
public class TradeLogController {

    @Autowired
    private ITradeLogService tradeLogService;

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostMapping("/bank/access/card")
    public SignatureDto proxyBindCardLog(@RequestBody BankCardAddDTO bankCardAddDTO) {
        //绑卡 日志后返回的数据
        SignatureDto signatureDto = tradeLogService.proxyBindCardLog(bankCardAddDTO);
        return signatureDto;

    }

    /**
     * 银行托管服务
     *     使用MQ 把 银行 返回的数据 发送过来
     *       1、  托管服务的日志需要更新      status 数据同步 确认时间
     *       2、  使用MQ 模拟 银行系统给 用户绑卡发送消息  同步数据
     *
     */
    @PostMapping("/bank/access/receive")
    public String callbackUpdate(@RequestBody BankCardRequestDto bankCardRequestDto) {

        //01  银行返回数据后  托管服务的日志需要同步synchronize_status
        //通过银行流水号 查询 TradeLog 进行更新
        tradeLogService.update(
                Wrappers.lambdaUpdate(TradeLog.class)
                        .set(TradeLog::getSynchronizeStatus,1)
                        .set(TradeLog::getConfirmDate,new Date())
                        .eq(TradeLog::getReqCode,bankCardRequestDto.getReqCode())
        );

        //02  银行返回数据后  使用MQ 模拟 银行系统给 用户绑卡发送消息  同步数据
        /**
         *  convertAndSend 方法参数说明:
         *     参数1： 交换机
         *     参数2： 路由
         *     参数3： 数据(消息)
         */
        rabbitTemplate.convertAndSend(MQConstant.SDDFP_EXCHANGE_BIND, MQConstant.BIND_CARD_MESSAGE,
                bankCardRequestDto);

        return "银行发送数据 给 system 系统 ";
    }

    @PostMapping("/bank/access/status")
    public Result<BaseResult> syncBorrowRecord(@RequestBody BorrowSyncRecordVo borrowSyncRecordVo) {

        //先不写返回的数据 (最终的返回数据和银行有关系)
        BaseResult baseResult = tradeLogService.syncBorrowRecord(borrowSyncRecordVo);

        return Result.ok(baseResult);
    }

}
